/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xmlaufgabe7;

import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Klasse dient zum Parsen des vorgegebenen XML Dokuments und der zugehoerigen
 * DTD. Geparste, wichtige Informationen werden in einer zuvor uebergebenen ArrayList
 * mit Typ eines UebungData Datenobjekts gespeichert.
 * 
 * @author s0527676
 */
public class ContentParser extends DefaultHandler {

    /**
     * Speichert Datenobjekte
     */
    private ArrayList<UebungData> dataModelList;
    
    /**
     * Speichert aktuellen Index der Datenobjektliste
     */
    private int dataModelIndex;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inUebung;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inRessource;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inLabel;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inName;
    
    /**
     * Standard Konstruktor, initialisiert Felder.
     * 
     * @param modelList Uebergebene ArrayList zur Speicherung von UebungData Objekten
     */
    public ContentParser(ArrayList<UebungData> modelList) {
        dataModelList = modelList;
        dataModelIndex = 0;
        inUebung = false;
        inRessource = false;
        inLabel = false;
        inName = false;
    }
    
    /**
     * Parst in der aktuellen Zeile im XML Dokument nach Starttags, filtert
     * wichtige Informationen heraus und speichert diese in einem UebungData Datenobjekt.
     * Setzt Stati der Ortszustaende.
     * 
     * @param nameSpace Namespace des Tag-Elements
     * @param elementName Elementname des Tag-Elements
     * @param qualifiedName Qualifizierter Name des Tag-Elements
     * @param attribute Attributliste des Tag-Elements
     * @throws SAXException 
     */
    @Override
    public void startElement(String nameSpace, String elementName, String qualifiedName, Attributes attribute) throws SAXException {
        String url = "http://harald-brandenburg.de/xml-jaxp/";
        
        if(elementName.equals("uebung")) {
            dataModelList.add(new UebungData());
            inUebung = true;
            dataModelList.get(dataModelIndex).setNumber(Integer.parseInt(attribute.getValue(0)));
        }
        
        if(inUebung && !inRessource) {
            if(elementName.equals("datei")) {
                dataModelList.get(dataModelIndex).setAufgabeURL(url + attribute.getValue(0));
                //System.out.println(url + attribute.getValue(0));
            }
            
            if(elementName.equals("label")) {
                inLabel = true;
            }
            
            if(elementName.equals("ressource")) {
                inRessource = true;
            }
        }
        
        if(inRessource) {
            if(elementName.equals("datei")) {
                dataModelList.get(dataModelIndex).addResourceURLs(url + attribute.getValue(0));
                //System.out.println(url + attribute.getValue(0));
            }
            
            if(elementName.equals("label")) {
                inLabel = true;
            }
            
            if(elementName.equals("name")) {
                inName = true;
            }
        }
    }
    
    /**
     * Parst in der aktuellen Zeile im XML Dokument nach Endtags und setzt Stati
     * der Ortszustaende innerhalb des XML Dokuments.
     * 
     * @param nameSpace Namespace des Tag-Elements
     * @param elementName Elementname des Tag-Elements
     * @param qualifiedName Qualifizierter Name des Tag-Elements
     * @throws SAXException 
     */
    @Override
    public void endElement(String nameSpace, String elementName, String qualifiedName) throws SAXException {
        if(inUebung) {
            if(elementName.equals("label")) {
                inLabel = false;
            }

            if(elementName.equals("name")) {
                inName = false;
            }
            
            if(elementName.equals("ressource")) {
                inRessource = false;
            }

            if(elementName.equals("uebung")) {
                dataModelIndex++;
                inUebung = false;
            }
        }
    }
    
    /**
     * Parst in der aktuellen Zeile im XML Dokument den Text zwischen Start-
     * und Endtags und speichert wichtige Informationen im UebungData Objekt.
     * 
     * @param text Text zwischen Start- und Endtags
     * @param start Startposition des wichtigen Textteils
     * @param length Laenge des Textes
     * @throws SAXException 
     */
    @Override
    public void characters(char[] text, int start, int length) throws SAXException {
        if(inLabel && !inRessource) {
            String label = "";
            
            for(int i = 0; i < length; i++) {
                label = label.concat(Character.toString(text[start+i]));
            }
            
            dataModelList.get(dataModelIndex).setAufgabeLabel(label);
            //System.out.println(label);
        }
        
        if(inLabel && inRessource) {
            String label = "";
            
            for(int i = 0; i < length; i++) {
                label = label.concat(Character.toString(text[start+i]));
            }
            
            dataModelList.get(dataModelIndex).addFileNames(label);
            //System.out.println(label);
        }
        
        if(inName) {
            String name = "";
            
            for(int i = 0; i < length; i++) {
                name = name.concat(Character.toString(text[start+i]));
            }
            
            dataModelList.get(dataModelIndex).addResourceName(name);
            //System.out.println(name);
        }
    }
}
